﻿using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using LED.Helper;

namespace SXC.LED.Control
{ 
   interface ISXCLEDControl
    {
        /*
        LED引导驱动通信接口协议V1.03（草拟）

1、总体描述
本文件定义了LED显示屏编程接口需要使用的数据结构和函数，各LED显示屏提供厂商提供的编程接口应符合该协议的描述。我方集成平台将使用该接口作为与产品厂商设备进行操作与通信的底层协议。
产品厂商以DLL动态链接库的形式提供接口，运行在Windows操作系统上。
提供的DLL动态链接库名称为: InsigmaLEDDriver.dll
注：
1、我方只提供逻辑的显示屏设备ID号，该ID号和具体的物理显示屏的对应关系配置由各厂商的DLL组件提供，以后调用协议接口函数只通过逻辑设备ID号进行对指定屏的各项操作。
设备ID，宽，高，点距，色彩特性，IP地址，端口号，串口地址，串口波特率，485地址，缓存能力（最大缓存的画面数量）
485通信统一采用8个数据位、1个停止位，无奇偶校验；以太网通信采用tcp连接；
2、同步屏的各个区域的切入效果不实现。
2、协议数据结构
2.1 区域进入的效果定义*/
        ///#define LED_BLOCK_NORMAL		1	/// 固定显示
        ///#define LED_BLOCK_LEFT_MOVE		2	/// 从左向右移动
        ///#define LED_BLOCK_RIGHT_MOVE	3	/// 从右向左移动
        ///#define LED_BLOCK_UP_MOVE		4	/// 从上往下移动
        ///#define LED_BLOCK_DOWN_MOVE	5	/// 从下往上移动
        ///#define LED_BLOCK_FLASH			6	/// 闪烁显示
        ///2.2 区域块范围
        ///typedef struct tagLEDBlock
        ///{
        ///int		nStartX;  			/// 区域的开始X坐标
        ///    int		nStartY;				/// 区域的开始Y坐标
        ///    int		nWidth; 				/// 区域的宽度
        ///    int		nHeight;  			/// 区域的高度
        ///} LEDBlock, * LPLEDBlock;
        ///2.3 字体描述符
        ///tpedef struct tagFontDescriptor
        ///{
        ///    char	szFontName[32];		 	/// 字体名称
        ///    Int32	lFontSize; 				/// 字体大小
        ///    unsigned Int32	lFontColor; 		/// 字体颜色
        ///    int		nBold; 				/// 是否粗体 0:正常 1:粗体
        ///    int		nStrick;    			/// 是否斜体 0:正常 1:斜体
        ///    int		nUnderline; 			/// 是否下划线 0:正常 1:下划线
        ///} LEDFontDescriptor, * LPLEDFontDescriptor;
        ///2.4时钟结构描述
        ///typedef struct tagClockDescriptor
        ///{
        ///    int		nClockType;      /// 时钟类型 0:电子钟 1:圆形表盘时钟
        ///    int		nShowFormat; 	/// 0:只显示年月日 1:只显示时分秒 2:0和1的组合，即显示年月日又显示分秒时
        ///    unsigned Int32	nScaleColor; 			/// 表盘刻度线的颜色
        ///    unsigned Int32	nBoundColor;			/// 表盘边框线颜色
        ///    unsigned Int32	nHourColor; 			/// 表盘时针颜色
        ///    unsigned Int32	nMinuteColor; 		/// 表盘分针颜色
        ///    unsigned Int32	nSecondColor; 		/// 表盘秒针颜色
        ///} LEDClockDescriptor, * LPLEDClockDescriptor;
        ///3、协议功能函数
        ///3.1 初始化动态链接库
        ///定义：Int32 InsigmaLEDDriver_Init( void );
        ///功能：初始化动态链接库，将需要进行DLL初始化的代码放在这个函数中。
        ///输入：无。
        ///返回：成功返回0，失败返回-1。
       Int32 InsigmaLEDDriver_Init();
        ///3.2 清理动态链接库
        ///函数：void InsigmaLEDDriver_Cleanup( void );
        ///功能：卸载动态链接库，将需要进行DLL卸载的代码放在这个函数里，比如设备内存释放等
        ///输入：无。
        ///返回：无。
        void InsigmaLEDDriver_Cleanup();
        ///3.3 设备状态检测
        ///函数：Int32 LED_IsDeviceOK( int nLEDID );
        ///功能：检测指定的屏幕显示设备是否正常运行；
        ///输入：nLEDID - 设备ID；
        ///返回：1表示正常， -1表示出现异常。
        Int32 LED_IsDeviceOK(int nLEDID);
        ///3.4 电源开关控制
        ///函数：Int32 LED_SwitchPower( int nLEDID, int nTurnOn );
        ///功能：对远程显示屏设备进行开关控制
        ///输入：	nLEDID - 设备ID；
        ///nTurnOn - 0表示关， 1表示开；
        ///返回：成功返回0，失败返回-1
        Int32 LED_SwitchPower(int nLEDID, int nTurnOn);
        ///3.5 获取电源开关状态
        ///函数：Int32 LED_IsDeviceTurnOn( int nLEDID );
        ///功能：查询远程显示设备是否打开；
        ///输入：nLEDID - 设备ID；
        ///返回：成功返回0，失败返回-1。
        Int32 LED_IsDeviceTurnOn(int nLEDID);
        ///3.6 屏幕亮度控制
        ///函数：Int32 LED_SetBright( int nLEDID, Int32 lValue );
        ///功能：设置远程显示屏的亮度
        ///输入：nLEDID - 设备ID 
        ///lValue - 具体的亮度值
        ///返回：成功返回0，失败返回-1。
        Int32 LED_SetBright(int nLEDID, Int32 lValue);
        ///3.7 获取屏幕亮度
        ///函数：Int32 LED_GetBright( int nLEDID );
        ///功能：获取远程显示屏的亮度值
        ///输入：nLEDID - 设备ID
        ///返回：Int32 获取到的亮度值
        Int32 LED_GetBright(int nLEDID);
        ///3.8 重启屏幕设备
        ///函数：Int32 LED_Restart( int nLEDID );
        ///功能：重启指定的远程显示屏设备，重启后如果显示屏内含有固化的帧就显示固化数据，否则不显示； 
        ///输入： nLEDID - 设备ID；
        ///返回：成功返回0，失败返回-1。
        Int32 LED_Restart(int nLEDID);
        ///3.9 校对时钟
        ///函数： int LED_AdjustCurrentTime( int nLEDID );
        ///功能： 对指定的显示屏进行当前时间的校对，当显示屏显示的时间值不准确时，通过调用这个函数可以恢复当前精确时间
        ///输入： nLEDID - 设备ID；
        ///返回：成功返回0，失败返回-1。
        int LED_AdjustCurrentTime(int nLEDID);
        ///3.10 预加载位图资源
        /// 函数： int LED_PreUploadBMP( int nLEDID, const char *szBmpFile ); (只对异步屏)
        /// 功能： 预先将指定的位图数据上传到指定的LED显示屏的存储器；
        /// 输入： nLEDID - 设备ID，
        ///szBmpFile - 位图的文件名；
        /// 返回：成功返回0，失败返回-1。 
        int LED_PreUploadBMP(int nLEDID, string szBmpFile);
        ///3.11 删除预加载位图
        ///函数： int LED_RemoveUploadedBmp( int nLEDID, const char *szBmpFile ); (只对异步屏)
        ///功能： 删除LED显示屏存储器中的位图图片
        ///输入： nLEDID - 设备ID
        ///szBmpFile - 位图的文件名
        ///返回： 成功返回0，失败返回-1。
        int LED_RemoveUploadedBmp(int nLEDID, string szBmpFile);
        ///3.12 获取剩余缓存空间
        ///函数： Int32 LED_GetFreeUploadBmpSpace( int nLEDID ); (只对异步屏)
        ///功能： 获取LED显示屏可以存储的剩余空间(以字节为单位)；
        ///输入： nLEDID - 设备ID；
        ///返回： Int32 剩余字节数。
        Int32 LED_GetFreeUploadBmpSpace(int nLEDID);
        ///3.13 初始化屏幕
        ///函数：Int32 LED_LEDScreenInit( int nLEDID, int nScreenType, int nWidth, int nHeight );
        ///功能：初始化指定的屏，做好添加帧数据的一切准备；
        ///输入：nLEDID - 设备ID
        ///      nScreenType - 屏幕类型 0:异步屏 1:同步屏
        ///      nWidth  - 要显屏的宽度
        ///      nHeight - 显示屏的高度
        ///返回：成功返回0，失败返回-1。
        Int32 LED_LEDScreenInit(int nLEDID, int nScreenType, int nWidth, int nHeight);
        ///3.14 清屏
        ///函数： Int32 LED_LEDClear( int nLEDID );
        ///功能： 删除指定屏的所有数据(清屏操作)；
        ///输入： nLEDID - 设备ID；
        ///返回： 成功返回0，失败返回-1。
        Int32 LED_LEDClear(int nLEDID);
        ///3.15 添加节目
        ///函数： Int32 LED_BeginProgram( int nLEDID,int nProgramID,Int32 lDisplayTime );
        ///功能： 通知指定设备号的LED显示屏，像该屏幕添加节目编号为nProgramID的节目，如果该节目已经存在，则相当于覆盖，如果不存在，则另外添加，即做到可以保持多个节目，根据指定的节目编号通过调用LED_RunProgram显示某一节目。
        ///       在直到调用LED_EndProgram之前的所有区域添加函数的调用都将添加到最近的LED_BeginProgram调用所指定的节目里。
        ///输入： nLEDID - 设备ID
        ///nFrameID – 节目ID编号
        ///lDisplayTime - 该节目显示时间(以毫秒为单位)；
        ///返回：成功返回0，失败返回-1。
        Int32 LED_BeginProgram(int nLEDID, int nProgramID, Int32 lDisplayTime);
        ///3.16 添加文字区块
        ///函数： void LED_AddTextBlock( int nLEDID, const char *szText, LEDBlock rect, LPFontDescriptor lpFont, int nEffectType, int nSpeed, Int32 lTrasnparent );
        ///功能： 在当前节目内添加一个文字区块；
        ///输入： nLEDID - 设备ID
        ///       szText - 要显示的字符串(不考虑分行，单行显示)
        ///       rect - 字符的显示区块
        ///       lpFont - 字体描述
        ///       nEffectType - 区块切入的效果
        ///      nSpeed - nEffectType>=2 and nEffectType<=5 表示移动的速度，nEffectType=6表示闪烁的频率
        ///   lTrasnparent - 字体是否透明(如果厂商支持则需要提供) 1:透明 0:不透明
        ///返回：无。
        void LED_AddTextBlock(int nLEDID,string szText, LEDBlock rect, LEDFontDescriptor lpFont, int nEffectType, int nSpeed, Int32 lTrasnparent);
        ///3.17 添加位图区块
        ///函数：void LED_AddBmpBlock( int nLEDID, const char *szBmpFile, LEDBlock destRect, LEDBlock sourceRect, int nEffectType, int nSpeed, Int32 lTrasnparent );
        ///功能：在当前节目内添加一个位图区块
        ///输入：nLEDID - 设备ID
        ///      szBmpFile – 位图的文件名称
        ///     destRect - 在屏幕上显示的目标矩形
        ///      sourceRect - 截取的原图矩形
        ///      nEffectType - 区块切入的效果
        ///      nSpeed - nEffectType>=2 and nEffectType<=5 表示移动的速度，nEffectType=6表示闪烁的频率
        ///      lTrasnparent - 位图是否透明(如果厂商支持则需要提供) 1:透明 0:不透明
        ///返回: 无。
       void LED_AddBmpBlock( int nLEDID, string szBmpFile, LEDBlock destRect, LEDBlock sourceRect, int nEffectType, int nSpeed, Int32 lTrasnparent );
       
        ///3.18 添加时钟区块
        ///函数：void LED_AddClockBlock(int nLEDID, LEDBlock rect, LPClockDescriptor lpClock, LPFontDescriptor lpFont, int nEffectType, int nSpeed, Int32 lTrasnparent );
        ///功能：在当前节目内添加一个时间区块；
        ///输入：nLEDID - 设备ID
        ///      Rect - 在屏幕上显示的目标矩形
        ///      lpClock - 时间描述符
        ///      lpFont - 字体描述符
        ///      nEffectType - 区块切入的效果
        ///      nSpeed - nEffectType>=2 and nEffectType<=5 表示移动的速度，nEffectType=6表示闪烁的频率
        ///      lTrasnparent - 位图是否透明(如果厂商支持则需要提供) 1:透明 0:不透明
        ///返回：无。
        void LED_AddClockBlock(int nLEDID, LEDBlock rect, LEDClockDescriptor lpClock, LEDFontDescriptor lpFont, int nEffectType, int nSpeed, Int32 lTrasnparent);
        ///3.19 添加直线区块
        ///函数：void LED_AddLine( int nLEDID, int x0, int y0, int x1, int y1, unsigned Int32 lColor );
        ///功能：当前节目内添加一条直线；
        ///输入：nLEDID - 设备ID；
        ///      x0 - 开始X坐标；
        ///      y0 - 开始Y坐标；
        ///      x1 - 结束X坐标；
        ///      Y1 - 结束Y坐标；
        ///      lColor - 线条颜色；
        ///返回：无。
        void LED_AddLine( int nLEDID, int x0, int y0, int x1, int y1, Int32 lColor );
        ///3.20 添加动画区域
        ///函数：void LED_AddAnimationBlock(int nLEDID, const char *szPath, int nDir, LEDBlock rcRect ); (只对同步屏)
        ///功能：在当前节目内添加一个动画在(多帧图片)区域；
        ///输入：	nLEDID - 设备ID；
        ///        szPath - 动画文件路径；
        ///        nDir - 0表示是将动画的多帧存放在szPath指定的同一个图片文件中(bmp,png,jpg等)
        ///        rcRect – 区域的大小范围
        ///      等于1表示动画文件由一系列图片文件组成，这些文件存放在szPath的指定目录下
        ///返回：无。
        void LED_AddAnimationBlock(int nLEDID, string szPath, int nDir, LEDBlock rcRect );
        ///3.21 增加视频区域
        ///函数：void LED_AddVideoBlock( int nLEDID, const char *szPath, LEDBlock rcRect ); (只对同步屏)
        ///功能：在当前节目内添加一个视频区域
        ///输入：nLEDID - 设备ID
        ///      szPath - 指定的视频文件
        ///      rcRect – 区域的大小范围
        ///返回：无。
        void LED_AddVideoBlock( int nLEDID,string szPath, LEDBlock rcRect );
        ///3.22 结束节目编辑
        ///函数：Int32 LED_EndProgram( int nLEDID，int nProgramID );
        ///功能：通知指定的屏幕当前节目的编辑已经完成
        ///输入：nLEDID - 设备ID
        ///nProgramID - 节目编号ID
        ///返回：成功返回0，失败返回-1。
        Int32 LED_EndProgram( int nLEDID,int nProgramID );
        ///3.23 节目发送
        ///函数：int LED_SendToScreen ( int nLEDID，int nProgramID ); (只对异步屏)
        ///功能：把当前组织形成的屏幕数据作为指定的节目编号发送到指定设备；结合3.15~3.22
        ///输入：nLEDID -设备ID
        ///nProgramID - 节目编号ID；
        ///返回：成功返回0，失败返回-1。
        int LED_SendToScreen ( int nLEDID,int nProgramID ); 
        ///3.24 节目删除
        ///函数：int LED_DeleteProgram ( int nLEDID，int nProgramID ); (只对异步屏)
        ///功能：在指定的LED设备上删除指定编号为nProgramID的节目。
        ///输入：nLEDID - 设备ID
        ///nProgramID -节目编号ID；
        ///返回：成功返回0，失败返回-1。
        int LED_DeleteProgram ( int nLEDID,int nProgramID ); 
        ///3.25 节目固化
        ///函数：Int32 LED_FastenProgram( int nLEDID ) (只对异步屏)
        ///功能：把当前屏幕上的数据固化；用于保存掉电后，重上电的默认画面
        ///输入：nLEDID -设备ID；
        ///返回：成功返回0，失败返回-1。
        Int32 LED_FastenProgram( int nLEDID );
        ///3.26 节目调用
        ///函数：Int32 LED_RunProgram( int nLEDID，int nProgramID ) (只对异步屏)
        ///功能：在指定设备上调用指定的节目单
        ///输入：nLEDID - 设备ID
        ///nProgramID - 节目编号ID；
        ///返回：成功返回0，失败返回-1。
        Int32 LED_RunProgram( int nLEDID,int nProgramID );
        ///4、工作流程
        ///在指定屏幕上生成一个节目或多个节目数据流程如下：
        ///1.调用LED_LEDScreenInit初始化指定屏，准备开始组织屏幕数据
        ///2.调用LED_BeginProgram向屏里增加一个节目
        ///3.根据屏类型调用一次或多次LED_AddTextBlock或LED_AddBmpBlock或LED_AddClockBlock或LED_AddLine或LED_AddAnimationBlock或LED_AddVideoBlock向当前帧添加各种类型区域
        ///4.调用LED_EndFrame结束当前节目的编辑
        ///5.根据需要返回第2步骤继续操作
        ///6.将发送的数据作为一个节目存储
        ///7.需要清屏时调用LED_LEDClear，重新开始绘制
        ///8.根据屏幕类型将编辑好的屏幕数据调用LED_SendToScreen发送到目标屏
        ///对于同步屏，接口协议将屏幕数据生成在操作PC上，通过屏幕映射显示到目标显示屏上


    }
}
